// 最小栈？
// 实现一个栈，带有pop 出栈，push 入栈，getMin 方法？O(1)
// O(n) => O(1) 空间换时间 1 
// push i 指针 最小值
// 缺点？   
// 1. 栈 熟悉   []  push pop  连续 
// 2. ADT getMin 这个方法的 O(n)
// 3. 指针变量 i 最小值 ，出栈 i 
// 4. 空间换时间 双栈 O(1)
// 用栈来实现队列 
var MinStack=function(){
    this.stack=[];//栈
    this.minStack=[];// 辅助栈 入栈的最小值，最小值在最上面 后进先出

}
// 把常考算法作为手写题来处理 
MinStack.prototype.push=function(x){
    this.minStack.push(Math.min(this.minStack[this.minStack.length - 1], x));
    // 每次都最小的进去
    this.stack.push(x);
}
MinStack.prototype.pop=function(){
    this.stack.pop();
    this.minStack.pop();
    
}

MinStack.prototype.top = function() {
    return this.stack[this.stack.length-1];
};

MinStack.prototype.getMin=function(){
    if(!this.minStack.length){
        throw new Error('stack is empty');
    }
    return this.minStack[this.minStack.length-1];// O(1)
}

const minStack = new MinStack();
console.log(minStack.push(-2));
console.log(minStack.push(0));
console.log(minStack.push(-3));
console.log(minStack.getMin());  
console.log(minStack.pop());
console.log(minStack.top());     
console.log(minStack.getMin());

